package com.xiaodei.springbootrabbitmqfanoutproducer.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 * @ClassName DirectRabbitConfig
 * @Deacription 声明注册direct模式的交换机并设置过期时间
 * @Author 王盟
 * @Date 2021/3/23 15:18
 * @Version 1.0
 **/
@Configuration
public class RabbitMqDirectTtlConfig {

    //1、声明注册direct模式的交换机并设置过期时间
    @Bean
    public DirectExchange directTtlExchange(){
        // 参数1：交换机名称，参数2：是否持久化 参数3：是否自动删除

        // durable:是否持久化,默认是false,持久化队列：会被存储在磁盘上，当消息代理重启时仍然存在，暂存队列：当前连接有效
        // exclusive:默认也是false，只能被当前创建的连接使用，而且当连接关闭后队列即被删除。此参考优先级高于durable
        // autoDelete:是否自动删除，当没有生产者或者消费者使用此队列，该队列会自动删除。

        return new DirectExchange("ttl_direct_exchange",true,false);
    }
    //2、声明队列 sms.direct.queue email.direct.queue duanxin.direct.queue
    @Bean
    public Queue ttlDirectQueue(){
        Map<String,Object> args2 = new HashMap<>();
        args2.put("x-message-ttl",5000);// 过期时间设置，这里一定是整形
        args2.put("x-dead-letter-exchange","dead_direct_exchange");//死信队列交换机
        args2.put("x-dead-letter-routing-key","dead");// 死信队列路由key

        // 一般设置一下队列的持久化就好,其余两个就是默认false
        return new Queue("ttl.direct.queue",true,false,false,args2);
    }


    //3、完成绑定关系（队列和交换机完成绑定关系）
    @Bean
    public Binding ttlDirectBinding(){
        return BindingBuilder.bind(ttlDirectQueue()).to(directTtlExchange()).with("ttl");// 短信队列与交换机绑定
    }

}
